home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The CICA Windows Explosion!
/
The CICA Windows Explosion! - Disc 2.iso
/
nt
/
xvidiff.zip
/
DEFSCR.C
next >
Wrap
C/C++ Source or Header
|
1993-01-01
|
6KB
|
328 lines
/* Copyright (c) 1990,1991,1992 Chris and John Downey */
#ifndef lint
static char *sccsid = "@(#)defscr.c 2.4 (Chris & John Downey) 9/4/92";
#endif
/***
* program name:
xvi
* function:
PD version of UNIX "vi" editor, with extensions.
* module name:
defscr.c
* module function:
VirtScr interface using old style porting functions.
We assume newscr() is only called once; it is an
error for it to be called more than once.
* history:
STEVIE - ST Editor for VI Enthusiasts, Version 3.10
Originally by Tim Thompson (twitch!tjt)
Extensive modifications by Tony Andrews (onecom!wldrdg!tony)
Heavily modified by Chris & John Downey
***/
#include "xvi.h"
static VirtScr *newscr P((VirtScr *));
static void closescr P((VirtScr *));
static int getrows P((VirtScr *));
static int getcols P((VirtScr *));
static void clear_all P((VirtScr *));
static void clear_line P((VirtScr *, int, int));
static void xygoto P((VirtScr *, int, int));
static void xyadvise P((VirtScr *, int, int, int, char *));
static void put_char P((VirtScr *, int, int, int));
static void put_str P((VirtScr *, int, int, char *));
static void ins_str P((VirtScr *, int, int, char *));
static void pset_colour P((VirtScr *, int));
static int colour_cost P((VirtScr *));
static int scroll P((VirtScr *, int, int, int));
static void flushout P((VirtScr *));
static void pbeep P((VirtScr *));
VirtScr defscr = {
NULL, /* pv_window */
0, /* pv_rows */
0, /* pv_cols */
newscr, /* v_new */
closescr, /* v_close */
getrows, /* v_rows */
getcols, /* v_cols */
clear_all, /* v_clear_all */
clear_line, /* v_clear_line */
xygoto, /* v_goto */
xyadvise, /* v_advise */
put_str, /* v_write */
put_char, /* v_putc */
pset_colour, /* v_set_colour */
colour_cost, /* v_colour_cost */
flushout, /* v_flush */
pbeep, /* v_beep */
ins_str, /* v_insert */
scroll, /* v_scroll */
NULL, /* v_flash */
NULL, /* v_status */
NULL, /* v_activate */
};
int
main(argc, argv)
int argc;
char *argv[];
{
xvEvent event;
long timeout = 0;
/*
* Set up the system and terminal interfaces. This establishes
* the window size, changes to raw mode and does whatever else
* is needed for the system we're running on.
*/
sys_init();
if (!can_inschar) {
defscr.v_insert = NULL;
}
if (!can_scroll_area && !can_ins_line && !can_del_line) {
defscr.v_scroll = NULL;
}
defscr.pv_rows = Rows;
defscr.pv_cols = Columns;
defscr.pv_window = (genptr *) xvi_startup(&defscr, argc, argv,
getenv("XVINIT"));
while (1) {
register int r;
r = inchar(timeout);
if (r == EOF) {
event.ev_type = Ev_timeout;
} else {
event.ev_type = Ev_char;
event.ev_inchar = r;
}
timeout = xvi_handle_event(&event);
}
return 0;
}
/*ARGSUSED*/
static VirtScr *
newscr(scr)
VirtScr *scr;
{
return(NULL);
}
/*ARGSUSED*/
static void
closescr(scr)
VirtScr *scr;
{
}
/*ARGSUSED*/
static int
getrows(scr)
VirtScr *scr;
{
return(scr->pv_rows);
}
/*ARGSUSED*/
static int
getcols(scr)
VirtScr *scr;
{
return(scr->pv_cols);
}
/*ARGSUSED*/
static void
clear_all(scr)
VirtScr *scr;
{
erase_display();
}
/*ARGSUSED*/
static void
clear_line(scr, row, col)
VirtScr *scr;
int row;
int col;
{
tty_goto(row, col);
erase_line();
}
/*ARGSUSED*/
static void
xygoto(scr, row, col)
VirtScr *scr;
int row;
int col;
{
tty_goto(row, col);
}
/*ARGSUSED*/
static void
xyadvise(scr, row, col, index, str)
VirtScr *scr;
int row;
int col;
int index;
char *str;
{
if (index > cost_goto) {
tty_goto(row, col + index);
} else {
tty_goto(row, col);
while (--index > 0) {
outchar(*str++);
}
}
}
/*ARGSUSED*/
static void
put_str(scr, row, col, str)
VirtScr *scr;
int row;
int col;
char *str;
{
tty_goto(row, col);
outstr(str);
}
/*ARGSUSED*/
static void
put_char(scr, row, col, c)
VirtScr *scr;
int row;
int col;
int c;
{
tty_goto(row, col);
outchar(c);
}
/*ARGSUSED*/
static void
ins_str(scr, row, col, str)
VirtScr *scr;
int row;
int col;
char *str;
{
/*
* If we are called, can_inschar is TRUE,
* so we know it is safe to use inschar().
*/
tty_goto(row, col);
for ( ; *str != '\0'; str++) {
inschar(*str);
}
}
/*ARGSUSED*/
static void
pset_colour(scr, colour)
VirtScr *scr;
int colour;
{
set_colour(colour);
}
/*ARGSUSED*/
static int
colour_cost(scr)
VirtScr *scr;
{
#ifdef SLINE_GLITCH
return(SLINE_GLITCH);
#else
return(0);
#endif
}
/*ARGSUSED*/
static int
scroll(scr, start_row, end_row, nlines)
VirtScr *scr;
int start_row;
int end_row;
int nlines;
{
if (nlines < 0) {
/*
* nlines negative means scroll reverse - i.e. move
* the text downwards with respect to the terminal.
*/
nlines = -nlines;
if (can_scroll_area) {
scroll_down(start_row, end_row, nlines);
} else if (can_ins_line && end_row == Rows - 1) {
int line;
for (line = 0; line < nlines; line++) {
tty_goto(start_row, 0);
insert_line();
}
} else {
return(0);
}
} else if (nlines > 0) {
/*
* Whereas nlines positive is "normal" scrolling.
*/
if (can_scroll_area) {
scroll_up(start_row, end_row, nlines);
} else if (end_row == Rows - 1) {
int line;
if (can_del_line) {
for (line = 0; line < nlines; line++) {
tty_goto(start_row, 0);
delete_line();
}
} else if (start_row == 0) {
tty_goto(start_row, 0);
for (line = 0; line < nlines; line++) {
delete_line();
}
} else {
return(0);
}
} else {
return(0);
}
}
return(1);
}
/*ARGSUSED*/
static void
flushout(scr)
VirtScr *scr;
{
flush_output();
}
/*ARGSUSED*/
static void
pbeep(scr)
VirtScr *scr;
{
alert();
flush_output();
}